//
//  ZZUserAccountModel.swift
//  sina
//
//  Created by 张鹏 on 16/5/24.
//  Copyright © 2016年 ZP. All rights reserved.
//
//  1. 用户账户的视图模型
//  作用 : 封装网络请求
        //存储用户数据
        //对外提供本地缓存的用户数据



import UIKit
import SVProgressHUD
//偏好设置保存的key,确保唯一
private let userInfoKey = "com.baidu.userInfoKey"

class ZZUserAccountViewModel: NSObject {
    
    //单例对象
   static let sharedAccountViewModel : ZZUserAccountViewModel = ZZUserAccountViewModel()
    
    
    var userAccount : ZZUserAccount?
    
    //重写构造方法,并且在构造方法中加载ZZUserAccount模型
   private override init() {
        super.init()
    userAccount = loadUserAccount()
    }
    
    //通过判断用户是否登录的计算型属性,来解决每次都需要判断的问题
    
    var userLogin : Bool {
        //计算型属性的特点 :每次调用都会执行
        if userAccount?.expires_date?.compare(NSDate())  == .OrderedDescending {
            return true
        }
        //如果过期, 需要将 userAccount 设为nil
        userAccount = nil
        return false
    }
 
    }


//加载网络请求
extension ZZUserAccountViewModel {

    //获取code值之后,根据code值 获取token值            闭包
    func loadAccessToken (code : String ,finished :(isSuccess : Bool) -> () ) {
        //获取网络请求
        ZZNetworkTools.sharedTools.loadAccessToken(code) { (responseObject, error) in
  
            if error != nil {
                //                SVProgressHUD.showSuccessWithStatus(noWIFI)
                //失败
                finished(isSuccess: false)
                print(error)
                return
            }
            //请求成功
            //此处 finished 不能传值
           self.loadUserInfo(responseObject, finished: finished)
            print("请求成功")
        }
    }


    //token值请求成功
        private func loadUserInfo(responseObject : AnyObject?, finished :(isSuccess : Bool) -> ()) {
        
        //强转字典类型
        guard let result = responseObject as? [String : AnyObject] else {
            finished(isSuccess: false)
            
            return
        }
        
        ZZNetworkTools.sharedTools.loadUserInfo(result) { (responseObject, error) in

            //请求失败
            if error != nil {
                
                finished(isSuccess: false)
                return
            }
            
            //请求成功
            guard var dict = responseObject as? [String : AnyObject] else {
                //如果没有请求成功
                finished(isSuccess: false)
                return
                
            }
            
            //遍历两个字典的用户信息
            //合并两个字典,把数据保存到本地
            //key 和 value 的值不会发生改变
            
            //如果请求成功
            for (key, value) in result {
                dict[key] = value
            }
            //要循环结束之后,才能给模型赋值,不然会没值
            self.saveAccount(dict)
            finished(isSuccess: true)
            //            SVProgressHUD.showSuccessWithStatus("请求成功")
            
            //TODO: -----切换到欢迎界面
            //            UIApplication.sharedApplication().keyWindow?.rootViewController = ZZWelcomeViewController()
            NSNotificationCenter.defaultCenter().postNotificationName(SwitchRootViewController, object: nil)
        }
    }

}
//存储数据
extension ZZUserAccountViewModel {
    
        //存储数据
    func saveAccount(dict : [String : AnyObject]) {
        //将dict数据转化为模型对象
        let user = ZZUserAccount(dict: dict)
        
        //TODO: ----- 把ZZUserAccount模型中的值 赋值给 userAccount,解决了从登录状态到登录状态跳转不了的bug
        self.userAccount = user   //userAccount : 拿到ZZUserAccount 模型中的数据
        
        //将模型对象转化为字典
        let key = ["access_token","expires_in","uid","name","avatar_large","expires_date"]
        let userInfo = user.dictionaryWithValuesForKeys(key)
        
        //设置偏好设置,保存字典数据
        //standardUserDefaults() :用来实例化NSUserDefaults
        let userDefaults = NSUserDefaults.standardUserDefaults()
        
        //不能够向偏好设置中保存nil
//        if user.uid == nil {
//           user.uid = "111"
//        }
        userDefaults.setObject(userInfo, forKey: userInfoKey)
        
        //同步 syn
        userDefaults.synchronize()
        
        //打印偏好设置保存路径
        print(NSHomeDirectory())
    }
                                //设置为可选项才能return
    func loadUserAccount() -> ZZUserAccount? {
        
        //如果此处as! ,如果偏好设置中没有数据的时候,程序就会崩溃
        guard let dict = NSUserDefaults.standardUserDefaults().objectForKey(userInfoKey) as? [String : AnyObject] else {
            
        //防止第一次没有存储数据的时候,程序崩溃问题
            return nil
        }
        //字典转模型
        return  ZZUserAccount(dict: dict)
    }
}